【アップデート情報】BigQueryでJson functionsが新たに追加されました
Google Cloudデータエンジニアのはんざわです。
2023年8月7日のアップデートでいくつかのJson functionsが新たにGAになったので紹介します。
新たに追加されたJson functions
今回のアップデートで合計で11個のJson functionsが新たにGAになりました。
- JSON_ARRAY:JSON_ARRAYの公式ドキュメント
-
JSON_ARRAY_APPEND:JSON_ARRAY_APPENDの公式ドキュメント
-
JSON_ARRAY_INSERT:JSON_ARRAY_INSERTの公式ドキュメント
-
JSON_OBJECT:JSON_OBJECTの公式ドキュメント
-
JSON_REMOVE:JSON_REMOVEの公式ドキュメント
-
JSON_SET:JSON_SETの公式ドキュメント
-
JSON_STRIP_NULLS:JSON_STRIP_NULLSの公式ドキュメント
-
LAX_BOOL:LAX_BOOLの公式ドキュメント
-
LAX_FLOAT64:LAX_FLOAT64の公式ドキュメント
-
LAX_INT64:LAX_INT64の公式ドキュメント
-
LAX_STRING:LAX_STRINGの公式ドキュメント
それぞれの関数の詳細は上記の公式ドキュメントを参照してみてください。
例も豊富で非常に見やすかったです。
また、公式のブログもあるので併せて参考にしてみてください。
今回の記事ではこの中でも自分が特に注目しているJSON_OBJECT
とJSON_REMOVE
を紹介したいと思います。
JSON_OBJECT
JSON_OBJECT
ではKeyとValueを渡すことでJsonオブジェクトを作成することができます。
以下の例では、foo
に10
を渡し、bar
にTRUE
を渡しています。
SELECT JSON_OBJECT('foo', 10, 'bar', TRUE) AS json_data /*-----------------------* | json_data | +-----------------------+ | {"bar":true,"foo":10} | *-----------------------*/
これの何が嬉しいかというと既存のデータ基盤を丸ごとJsonオブジェクトに変換し、Json型で保持することが可能になりました。
実際に触ってみる
今回の検証ではサンプルデータセットのtrigrams
を使用します。
下記の画像はJson型変換前のテーブル情報です。
次に以下のクエリで対象のテーブルをJson型で丸ごと保持するようにします。
CREATE OR REPLACE TABLE test.json_object_table AS SELECT JSON_OBJECT ( 'ngram', ngram, 'first', first, 'second', second, 'third', third, 'fourth', fourth, 'fifth', fifth, 'cell', cell ) AS json_data FROM samples_dataset.trigrams
正常にjson_data
カラムのJson型として丸ごと保持することができました。
次にテーブル情報を確認してみましょう。
通常のテーブルと比べて、Json型のテーブルは物理バイト数が減っていることがわかると思います。
BigQueryの新料金プランでは、物理ストレージを基準に課金されるため物理ストレージ量を減らすことがコスト削減に繋がると思います。
JSON_REMOVE
JSON_REMOVE
はJsonデータから指定したパスやキーのデータを削除することができます。
- Json型のARRAY
SELECT JSON_REMOVE(JSON '["a", "b", "c"]', '$[1]') AS json_data /*-----------* | json_data | +-----------+ | ["a","c"] | *-----------*/ /* 削除対象を複数選択することも可能 */ SELECT JSON_REMOVE(JSON '["a", "b", "c"]', '$[0]', '$[0]') AS json_data /*-----------* | json_data | +-----------+ | ["c"] | *-----------*/
- Jsonオブジェクト
SELECT JSON_REMOVE(JSON '{"a": 1, "b": {"c": "2"}}', '$.a') AS json_data /*-----------------* | json_data | +-----------------+ | {"b":{"c":"2"}} | *-----------------*/ /* 階層化されたJsonもアクセス可能 */ SELECT JSON_REMOVE(JSON '{"a": 1, "b": {"c": "2"}}', '$.b.c') AS json_data /*----------------* | json_data | +----------------+ | {"a":1,"b":{}} | *----------------*/
弊チームでは既にUDFでJson型から要素を削除する関数を作成し、使用していたのでそれが正式にサポートされるようになった感じです。
JSON_OBJECT
の項目で紹介したように要素を丸ごとJson型データで保持するような場合、どうしても重複確認や結合キーの兼ね合いでそれに該当するカラムは事前に摘出する必要があります。
その際に摘出したカラムをJson型データから削除するとさらにストレージ効率が高くなると思います。
また、特定のカラムに機密情報などが含まれる場合も削除することが望ましいと思われます。
まとめ
新たに追加されたJson functionsのうち、JSON_OBJECT
とJSON_REMOVE
を紹介しました。
今回紹介できなかった関数はまだまだたくさんありますので是非公式ドキュメントを確認し、有効に活用してみてください。